package 基础练习; /**
 * @author： li
 * @date： 2021-11-28 20:09
 * @version 1.0
 */

import java.util.Scanner;

/**
 * @author： ljm
 * @date： 2021-11-28 20:09
 * @version 1.0
 */
/*
*资源限制
时间限制：1.0s   内存限制：512.0MB
问题描述
　　输入一个正整数n，输出n!的值。
　　其中n!=1*2*3*…*n。
算法描述
　　n!可能很大，而计算机能表示的整数范围有限，需要使用高精度计算的方法。使用一个数组A来表示一个大整数a，
    A[0]表示a的个位，A[1]表示a的十位，依次类推。
　　将a乘以一个整数k变为将数组A的每一个元素都乘以k，请注意处理相应的进位。
　　首先将a设为1，然后乘2，乘3，当乘到n时，即得到了n!的值。
输入格式
　　输入包含一个正整数n，n<=1000。
输出格式
　　输出n!的准确值。
样例输入
10
样例输出
3628800
* */
public class 阶乘计算 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int i,j;
        int jw = 0;			//进位
        int temp;			//存放中间结果
        int max = 4000;		//4000位
        int[] a = new int[max];
        a[0]=1;
            for (i = 2; i <=n; i++) {
                for (j = 0; j <max; j++) {
                    temp = a[j] * i + jw;         //当该位未赋值，即*0
                    jw = temp / 10;             //取十位（进位）
                    a[j] = temp % 10;
                }
            }
                //找出前置0和结果之间的界限
                for(i= max-1;i >= 0;i --){
                    if(a[i] != 0)
                        break;
                }
                System.out.println(i+"位");

            for(int al=i;al>=0;al--){
                System.out.print(a[al]);
            }

    }
}
/*public class jiechengjisuan {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int i=sc.nextInt();
        int k=1,l=0;
        for(l=i;l>0;l--){
            k=k*l;
        }
        System.out.println(k);
        int lenghth=Integer.toString(k).length();
        System.out.println(lenghth);
        int[] a = new int[lenghth];
        for(int j=0;j<lenghth; j++){
            double b=Math.pow(10.0,j);
            a[j]= (int) ((k/b)%10);
            System.out.println("值："+a[j]);
        }
        int alength=a.length;
        for(int al=0;al<alength;al++){
            System.out.println(a[al]);
        }
    }
}*/
